home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 147 / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan).7z / Gekkan Dennou Club - 2000.8 Vol. 147 (Japan) (Track 1).bin / games / wakka / source / main.c next >
Text File  |  2000-06-25  |  5KB  |  224 lines

  1. /********************************
  2.  
  3.     わっか
  4.  
  5.         メイン
  6.  
  7.  ********************************/
  8.  
  9. #include    <stdio.h>
  10. #include    <stdlib.h>
  11. #include    <sys\iocs.h>
  12. #include    <sys\dos.h>
  13.  
  14. #include    "wakka.h"
  15. #include    "screen.h"
  16. #include    "pad.h"
  17.  
  18.  
  19. BLOCK    field[LEN][LEN];        /* 盤 */
  20. int    field_dx[LEN][LEN];        /* ブロック移動用 */
  21. int    field_dy[LEN][LEN];
  22.  
  23. static int    spc_x, spc_y;        /* 空白の位置 */
  24.  
  25. #ifdef    WAKKA9
  26. static BLOCK    arrange[LEN - 2][LEN - 2] = {        /* 正解配置 */
  27.             { 2,  6, 10,  6,  3},
  28.             { 8,  1, 10,  1,  9},
  29.             {11, 11, -1, 11, 11},
  30.             { 8,  1, 10,  1,  9},
  31.             { 4,  7, 10,  7,  5}
  32.         };
  33. #else
  34. static BLOCK    arrange[LEN - 2][LEN - 2] = {        /* 正解配置 */
  35.             { 2, 16, 16, 16,  3},
  36.             {17, 12, 16, 13, 17},
  37.             {17, 17, -1, 17, 17},
  38.             {17, 14, 16, 15, 17},
  39.             { 4, 16, 16, 16,  5}
  40.         };
  41. #endif
  42.  
  43.  
  44. /***************************************
  45.     ブロックの移動
  46.     引数    dx, dy = 移動元の方向
  47.     戻り値    移動したか
  48.  ***************************************/
  49. static
  50. Bool    move_block(int dx, int dy)
  51. {
  52.     if ( (((spc_x + dx) % 2) || ((spc_y + dy) % 2))
  53.                     && (field[spc_y + dy][spc_x + dx] > 0) ) {
  54.         field[spc_y][spc_x]               = field[spc_y + dy][spc_x + dx];
  55.         field[spc_y + dy][spc_x + dx]     = field[spc_y + dy*2][spc_x + dx*2];
  56.         field[spc_y + dy*2][spc_x + dx*2] = -1;        /* 2つ移動 */
  57.         spc_x += dx*2;
  58.         spc_y += dy*2;
  59.         return    TRUE;
  60.     }
  61.     return    FALSE;
  62. }
  63.  
  64. /***************************************
  65.     移動アニメーション
  66.     引数    dx, dy = 移動元の方向
  67.     戻り値    移動したか
  68.  ***************************************/
  69. static
  70. Bool    move(int dx, int dy)
  71. {
  72.     int    i, n;
  73.  
  74.     if ( move_block(dx, dy) ) {                /* ブロックの移動 */
  75.         for (i = 0; i < 12; i++) {
  76.             n = (i < 8) ? (7 - i)*32 : 0;        /* 一つ目移動 */
  77.             field_dx[spc_y][spc_x - dx*2] = dx*n;
  78.             field_dy[spc_y - dy*2][spc_x] = dy*n;
  79.             n = (i > 4) ? (11- i)*32 : 0x100;    /* 二つ目移動 */
  80.             field_dx[spc_y][spc_x - dx] = dx*n;
  81.             field_dy[spc_y - dy][spc_x] = dy*n;
  82.             draw_screen();                /* 画面描画 */
  83.         }
  84.         return    TRUE;
  85.     }
  86.     return    FALSE;
  87. }
  88.  
  89. /**************
  90.     盤初期化
  91.  **************/
  92. static
  93. void    init_field(void)
  94. {
  95.     int    i, j;
  96.  
  97.     for (i = 0; i < LEN; i++) {                /* 盤クリア */
  98.         for (j = 0; j < LEN; j++) {
  99.             field[i][j] = ((i == 0) || (i == LEN - 1)
  100.                             || (j == 0) || (j == LEN - 1))
  101.                                 ? 0 : arrange[i - 1][j - 1];
  102.             field_dx[i][j] = 0;
  103.             field_dy[i][j] = 0;
  104.             if ( field[i][j]  < 0 ) {        /* 空白 */
  105.                 spc_x = j;
  106.                 spc_y = i;
  107.             }
  108.         }
  109.     }
  110. }
  111.  
  112. /****************
  113.     シャッフル
  114.  ****************/
  115. static
  116. void    shuffle_field(void)
  117. {
  118. static int    dx[4] = {1, -1, 0,  0},
  119.         dy[4] = {0,  0, 1, -1};
  120.     int    i, j, n;
  121.  
  122.     n = 1;
  123.     for (i = 0; i < 100; i++) {
  124.         do {
  125.             do {
  126.                 j = rnd(4);
  127.             } while ( j == (n ^ 1) );        /* 反対方向 */
  128.         } while ( !move_block(dx[j], dy[j]) );        /* 移動 */
  129.         n = j;
  130.     }
  131. }
  132.  
  133. /**********************************
  134.     クリアチェック
  135.     戻り値     TRUE : クリア
  136.         FALSE : 未クリア
  137.  **********************************/
  138. static
  139. Bool    check_clear(void)
  140. {
  141.     int    i, j;
  142.  
  143.     for (i = 1; i < LEN - 1; i++) {
  144.         for (j = 1; j < LEN - 1; j++) {
  145.             if ( field[i][j] != arrange[i - 1][j - 1] ) {
  146.                 return    FALSE;
  147.             }
  148.         }
  149.     }
  150.     return    TRUE;
  151. }
  152.  
  153. /************************************
  154.     ゲームメイン
  155.     戻り値     TRUE : ゲーム続行
  156.         FALSE : 終了
  157.  ************************************/
  158. static
  159. Bool    game_main(void)
  160. {
  161.     static Bool    f = TRUE;
  162.     PAD    pad;
  163.  
  164.     draw_back(rnd(4));                /* 背景描画 */
  165.     init_field();                    /* 盤初期化 */
  166.     if ( f ) {
  167.         if ( !wait_clear(FALSE) ) {        /* 正解表示 */
  168.             return    FALSE;
  169.         }
  170.         f = FALSE;
  171.     }
  172.     shuffle_field();                /* シャッフル */
  173.     while ( !esc_key ) {
  174.         draw_screen();                /* 画面描画 */
  175.  
  176.         pad = get_rept();            /* パッド入力 */
  177.         if ( pad & PAD_UP ) {
  178.             move(0, 1);            /* 上移動 */
  179.         }
  180.         else if ( pad & PAD_DOWN ) {
  181.             move(0, -1);            /* 下移動 */
  182.         }
  183.         else if ( pad & PAD_LEFT ) {
  184.             move(1, 0);            /* 左移動 */
  185.         }
  186.         else if ( pad & PAD_RIGHT ) {
  187.             move(-1, 0);            /* 右移動 */
  188.         }
  189.  
  190.         if ( check_clear() ) {            /* クリア */
  191.             return    wait_clear(TRUE);    /* 入力待ち */
  192.         }
  193.     }
  194.     return    FALSE;
  195. }
  196.  
  197. /************
  198.     メイン
  199.  ************/
  200. int    main(int argc, char* argv[])
  201. {
  202.     _iocs_tgusemd(0, 2);                /* グラフィック画面使用 */
  203.     _iocs_tgusemd(1, 2);                /* テキスト画面使用 */
  204.     _dos_c_curoff();                /* カーソルOFF */
  205.     _iocs_crtmod(0x0e);                /* 画面モード設定 */
  206.     _iocs_g_clr_on();                /* グラフィック画面表示 */
  207.     _iocs_b_bpoke((void*)0xe82500, 0x24);        /* プライオリティ設定 */
  208.     if ( init_screen() ) {                /* 画面初期化 */
  209.         return    1;
  210.     }
  211.     srand((unsigned int)_iocs_timeget());        /* 乱数初期化 */
  212.  
  213.     while ( game_main() );                /* ゲームメイン */
  214.  
  215.     _iocs_tgusemd(0, 3);                /* グラフィック画面使用 */
  216.     _iocs_tgusemd(1, 3);                /* テキスト画面使用 */
  217.     _dos_c_width(0);                /* 画面モード設定 */
  218.     _dos_c_curon();                    /* カーソルON */
  219.     _dos_kflushio(0xff);                /* キーバッファクリア */
  220.  
  221.     return    0;
  222. }
  223.  
  224. /************ End of File ******************************************************/